﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _07.@event
{
    class Program
    {
        //delegate、event 可以实现观察者模式。event可以保证外部`无法`调用委托的方法！
        //定义一个event，然后让其他对象 += 即可实现订阅。
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.Name = "Tommy";

            for (int i = 0; i < 10; i++)
            {
                var m = new Mouse();
                m.Name = i.ToString();
                cat.catIsComingEvent += m.TellMeCatIsComing;
            }

            //cat.catIsComingEvent(); //事件的特殊之处在于，无法在类的外部调用方法
            cat.CatCome();

            Console.ReadKey();
        }
    }
    class Cat
    {
        //0.委托
        public delegate void CatIsComing(Cat cat);
        //1.事件
        public event CatIsComing catIsComingEvent;
        public string Name { get; set; }

        //2.在事件所在类的内部，某个方法调用事件，回调！
        public void CatCome()
        {
            //catIsComingEvent(this); //群发事件！

            //或者这样调用
            Delegate[] list = catIsComingEvent.GetInvocationList();
            foreach (var item in list)
            {
                item.DynamicInvoke(this);//
            }
        }
    }
    class Mouse
    {
        public string Name { get; set; }
        public void TellMeCatIsComing(Cat cat)
        {
            Console.WriteLine("Mouse {0} got msg: Cat {1} is COMMING!", Name, cat.Name);
        }
    }
}
